package com.neo.design.chain.approve;

import com.neo.design.chain.ChainHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.DependsOn;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

/**
 * 经理审批处理<p/>
 *
 * 需要注意的是，使用{@code Order}注解的作用是定义该处理器的执行顺序，而{@code DependsOn}注解的作用
 * 是校验处理器是否完整，比如如果代码中需要使用的本处理器，但本处理器需要依赖于{@code DependsOn}标注的处理器，真实情况可以删除该注解，
 * 这里是为了安心，避免代码写漏了
 *
 * @author kevin
 * @see com.neo.design.chain.approve.ApproveHandler
 */
@Order(2)
@Component
@Slf4j
@DependsOn("directorApproveHandler")
public class ManagerApproveHandler implements ApproveHandler {
    private ChainHandler<ApproveRequest, ApproveResult> next;

    @Override
    public ApproveResult handleRequest(ApproveRequest request) {
        if (request.getStatus() == 2) {
            return ApproveResult.builder().message("经理审批").build();
        }
        log.info("经理已经审批过了，交由下一节点审批");
        Assert.notNull(next, "审批流程已结束，或不支持该操作。");
        return next.handleRequest(request);
    }

    @Override
    public void setNext(ChainHandler<ApproveRequest, ApproveResult> next) {
        this.next = next;
    }
}
